package pilas;

import clases.cds;
import javax.swing.JOptionPane;

/**
 *
 * @author D4y4
 */
public class pila {

    int tope;
    int numeroElementos;
    int topeAux;
    Object[] arrayPila2;
    boolean pasaDoble = false;
    Object[] arrayPila;//acepta cualquier tipo de informacion, numeros, letras

    public pila(int tope) { //click derecho, insert Code, constructor
        this.tope = tope;
        numeroElementos = 0;
        arrayPila = new Object[tope];
    }

    public void llenarObjeto() {
        arrayPila = new Object[tope];
        for (int i = 0; i < arrayPila2.length; i++) {
            arrayPila[i] = arrayPila2[i];
        }
    }

    public boolean pilaEstaLlena() //verificar si la pila esta llena
    {
        if (!this.pasaDoble && numeroElementos == tope) {//Solo cuando ste llena s reseteara y se hara doble
            //pasaDoble entrara una vesnada mas
//La implementación de la Pila con arrays establece un tamaño máximo de la pila que se 
//controla con el método pilaLlena(). Modificar este método de tal forma que, cuando se llene 
//la pila, se amplíe el tamaño del array a justamente el doble de la capacidad actual.

            this.pasaDoble = true;
            tope = tope * 2;
            arrayPila2 = arrayPila;
            llenarObjeto();

            JOptionPane.showMessageDialog(null, "pila esta llena y se asignara el doble.");
        }
        if (numeroElementos == tope) {

            return true;
        } else {
            return false;
        }
    }

    public void apilar(Object dato) {
        if (this.pilaEstaLlena()) {
            JOptionPane.showMessageDialog(null, "pila esta llena .");
        } else //seguir apilando el dato
        {
            arrayPila[numeroElementos] = dato;
            numeroElementos++;
        }
    }

    public boolean pilaVacia() {
        if (numeroElementos == 0) {
            return true;
        } else {
            return false;
        }
    }

    public cds desapilar() {//sacar los datos de la pila
        cds dato = null;
        if (pilaVacia()) {
            JOptionPane.showMessageDialog(null, "Pila esta vacia no hay datos para sacar");
        } else {
            dato = (cds) arrayPila[numeroElementos - 1];
            numeroElementos--;
        }
        return dato;
    }

    public String mostrarPila() {
        String mensajeSalida = " ";
        if (pilaVacia()) {
            mensajeSalida += "la pila esta vacia, no hay datos que mostrar";

        } else {
            for (int i = 0; i < numeroElementos; i++) {
                mensajeSalida += arrayPila[i] + "\n";//imprime los datos
                // mensajeSalida+=desapilar();//si el valor no lo guarda en una variable ese valor se pierde
            }
        }
        return mensajeSalida;
    }

    public Object obtenerDatoSuperior() {
        Object elementoSuperior = 0;
        for (int i = 0; i < numeroElementos; i++) {
            elementoSuperior = arrayPila[numeroElementos];
            numeroElementos++;

        }
        return elementoSuperior;
    }
// Escribir un método para determinar si una secuencia de caracteres de entrada es de la 
//forma: X & Y siendo X una cadena de caracteres e Y la cadena inversa. El carácter & es el
//separador.

    public boolean Verificar() {
        return true;
    }
}
